<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Jobs\RedisQueueTest;

class Test extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     * 发送命令行行时定义的任务名字
     * php artisan app:test
     */
    protected $signature = 'app:test';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        //
        //延迟队列 测试
        $this->daley_queue();

        //优先级队列 测试
       // $this->priority_queue();
        
        return 0;
    }


     // 延迟队列
     /**
      *  其原理是：
      *利用Redis 的 Sorted Set 这个数据类型，将时间戳当做 score 实现按指定时间排序的功能。
      * 先查询小于当前时间戳分数的数据，然后只取出这一部分的数据先消费
      * 发送队列命令：php artisan app:test
      * 消费信息命令：php artisan queue:work
      */
     public function daley_queue()
     {

         RedisQueueTest::dispatch('延迟队列=>任务发送时间：'.date('Y-m-d H:i:s'))
        ->delay(now()->addSeconds(random_int(0, 10)));
        $this->info('延迟队列=>任务已发送到队列！');
     }

     
     //优先级队列
     /** 指定队列消费优先级
      *
      * 发送队列命令：php artisan app:test
      * 消费信息命令：php artisan queue:work --queue=B,A,default
      */
    public function priority_queue(){
        for ($i = 6; $i > 0; $i--) {
            $queue = 'default';
            if ($i%3 == 1) {
              $queue = 'A';
            } else if ($i%3 == 2) {
              $queue = 'B';
            }
            sleep(random_int(0, 2));
            RedisQueueTest::dispatch('优先级队列=>当前优先队列为：' . $queue . '，入队时间：' . date("Y-m-d H:i:s"))->onQueue($queue);
            $this->info('优先级队列=>任务已发送到队列！');
        }
    }


}
